import Vue from 'vue'
import router from '@/router/router'
import config from '@/config/index.js'

import {
  fileImgMap,
  unknownImg,
  fileSuffixCodeModeMap,
  markdownFileType
} from '@/libs/map.js'


// 全局函数 - 文件相关
const fileFunction = {

  /**
     * 计算容量
     */
  calStorage(a, b) {
    const sum = (a / b).toFixed(3) * 100
    return sum
  },
  /**
   * 格式化文件大小
   */
  calculateFileSize(size, isInteger = false) {
    const B = 1024
    const KB = Math.pow(1024, 2)
    const MB = Math.pow(1024, 3)
    const GB = Math.pow(1024, 4)
    if (isInteger) {
      // 截取为整数
      if (size < B) {
        return `${size}B`
      } else if (size < KB) {
        return `${(size / B).toFixed(0)}KB`
      } else if (size < MB) {
        return `${(size / KB).toFixed(0)}MB`
      } else if (size < GB) {
        return `${(size / MB).toFixed(0)}GB`
      } else {
        return `${(size / GB).toFixed(0)}TB`
      }
    } else {
      // 保留小数位
      if (size < B) {
        return `${size}B`
      } else if (size < KB) {
        return `${(size / B).toFixed(0)}KB`
      } else if (size < MB) {
        return `${(size / KB).toFixed(1)}MB`
      } else if (size < GB) {
        return `${(size / MB).toFixed(2)}GB`
      } else {
        return `${(size / GB).toFixed(3)}TB`
      }
    }
  },
  /**
   * 获取流式的缩略图、视频封面图
   */
  getMinImgStream(row) {
    return `${config.baseContext}/filetransfer/preview?userFileId=${row.userFileId
      }&filePath=${row.filePath}&extendName=${row.extendName}`
  },
  /**
   * 获取文件查看路径
   */
  getViewFilePath(row) {
    return `${config.baseContext}/filetransfer/preview?userFileId=${row.userFileId
      }&filePath=${row.filePath}&extendName=${row.extendName}`
  },



  setFileImg(file) {
    if (file.isDir === 1) {
      //  文件夹
      return fileImgMap.get('dir')
    } else if (
      Number(router.currentRoute.query.fileType) !== 6 &&
      ['jpg', 'png', 'jpeg', 'gif', 'mp4'].includes(
        file.extendName.toLowerCase()
      )
    ) {
      // 图片、视频类型，直接显示缩略图
      return this.getMinImgStream(file)
    } else if (fileImgMap.has(file.extendName.toLowerCase())) {
      // 可以识别文件类型的文件
      return fileImgMap.get(file.extendName.toLowerCase())
    } else {
      // 无法识别文件类型的文件
      return unknownImg
    }
  },

  isVideoFile(file) {
    if (
      ['avi', 'mp4', 'mpg', 'mov', 'swf'].includes(
        file.extendName?.toLowerCase()
      )
    ) {
      return true
    } else {
      return false
    }
  },

  handleImgPreview(currentIndex, imgInfo = {}, imgInfoList = []) {
    // 图片分类下 - 传递整个页面的图片列表；非图片分类下 - 由单个图片构建图片列表
    const imgList =
      Number(router.currentRoute.query.fileType) === 1
        ? imgInfoList.map((item) => {
          return {
            ...item,
            fileUrl: this.getViewFilePath(item),
            // downloadLink: this.getDownloadFilePath(item)
          }
        })
        : [
          {
            ...imgInfo,
            fileUrl: this.getViewFilePath(imgInfo),
            // downloadLink: this.getDownloadFilePath(imgInfo)
          }
        ]
    const defaultIndex =
      Number(router.currentRoute.query.fileType) === 1 ? currentIndex : 0

    console.log(imgList)
    Vue.prototype.$openBox.imgPreview({ imgList, defaultIndex })
  },

  handleVideoPreview(currentIndex, videoInfo = {}, videoInfoList = []) {
    // 视频分类下 - 传递整个页面的视频列表；非视频分类下 - 由单个视频构建视频列表
    const videoList =
      Number(router.currentRoute.query.fileType) === 3
        ? videoInfoList.map((item) => {
          return {
            ...item,
            fileUrl: this.getViewFilePath(item),
            // downloadLink: this.getDownloadFilePath(item)
          }
        })
        : [
          {
            ...videoInfo,
            fileUrl: this.getViewFilePath(videoInfo),
            // downloadLink: this.getDownloadFilePath(videoInfo)
          }
        ]
    const defaultIndex =
      Number(router.currentRoute.query.fileType) === 3 ? currentIndex : 0
    Vue.prototype.$openBox.videoPreview({ videoList, defaultIndex })
  },

  handleAudioPreview(currentIndex, audioInfo = {}, audioInfoList = []) {
    // 音频分类下 - 传递整个页面的音频列表；非音频分类下 - 由单个音频构建音频列表
    const audioList =
      Number(router.currentRoute.query.fileType) === 4
        ? audioInfoList.map((item) => {
          return {
            ...item,
            fileUrl: this.getViewFilePath(item),
            // downloadLink: this.getDownloadFilePath(item)
          }
        })
        : [
          {
            ...audioInfo,
            fileUrl: this.getViewFilePath(audioInfo),
            // downloadLink: this.getDownloadFilePath(audioInfo)
          }
        ]
    const defaultIndex =
      Number(router.currentRoute.query.fileType) === 4 ? currentIndex : 0
    Vue.prototype.$openBox.audioPreview({ audioList, defaultIndex })
  },

  handleFileNameClick(row, currentIndex, fileList = []) {
    // 如果当前文件在回收站中，则不允许预览
    if (row.deleteFlag !== undefined && row.deleteFlag !== 0) {
      return false
    }
    // 若是文件夹则进入该文件夹
    if (row.isDir) {
      if (Number(router.currentRoute.query.fileType) !== 6) {

        // 网盘页面
        router.push({
          query: {
            filePath: `${row.filePath === '/' ? '' : row.filePath}/${row.fileName
              }`,
            fileType: 0
          }
        })
      }
    }
    // 若是文件，则进行相应的预览
    else {
      // 若当前点击项是图片
      const PIC = ['png', 'jpg', 'jpeg', 'gif', 'svg']
      if (PIC.includes(row.extendName.toLowerCase())) {
        this.handleImgPreview(currentIndex, row, fileList)
        return false
      }
      //  若当前点击项是pdf
      if (row.extendName.toLowerCase() === 'pdf') {
        window.open(this.getViewFilePath(row), '_blank')
      }
      //  若当前点击项是代码或文本文件
      let codeFileSuffix = row.extendName.toLowerCase()
      if (codeFileSuffix === 'yaml') {
        codeFileSuffix = 'yml'
      }
      // 无格式文件也可以在线编辑
      if (
        fileSuffixCodeModeMap.has(codeFileSuffix) ||
        (row.isDir === 0 && row.extendName === '')
      ) {
        Vue.prototype.$openBox.codePreview({ fileInfo: row, isEdit: false })
        return false
      }
      //  若当前点击项是 markdown 文档
      if (markdownFileType.includes(row.extendName.toLowerCase())) {
        Vue.prototype.$openBox.markdownPreview({
          fileInfo: row,
          editable: false
        })
        return false
      }
      //  若当前点击项是视频mp4格式
      const VIDEO = ['mp4', 'mpeg', 'rmvb', 'mkv', 'webm']
      if (VIDEO.includes(row.extendName.toLowerCase())) {
        this.handleVideoPreview(currentIndex, row, fileList)
        return false
      }
      //  若当前点击项是音频 mp3、flac 格式
      const AUDIO = ['mp3', 'flac']
      if (AUDIO.includes(row.extendName.toLowerCase())) {
        this.handleAudioPreview(currentIndex, row, fileList)
        return false
      }
    }
  },
  /**
   * 文件名称拼接，包括文件名称 + 文件后缀
   */
  getFileNameComplete(file, isHighlight = false) {
    return isHighlight === true && file.highlightFields
      ? `${file.highlightFields}${file.isDir === 0 && file.extendName ? `.${file.extendName}` : ''
      }`
      : `${file.fileName}${file.isDir === 0 && file.extendName ? `.${file.extendName}` : ''
      }`
  },

  getFileType(file) {
    return file.isDir === 1
      ? '文件夹'
      : file.extendName
        ? file.extendName
        : '文件'
  },

}

export default fileFunction
